package ophiux.wechatpay.sdk.request;

import java.util.HashMap;
import java.util.Map;

import ophiux.wechatpay.sdk.response.ReportResponse;

/**
 * 交易保障  请求参数<br/>
 * 商户在调用微信支付提供的相关接口时，会得到微信支付返回的相关信息以及获得整个接口的响应时间。为提高整体的服务水平，
 * 协助商户一起提高服务质量，微信支付提供了相关接口调用耗时和返回信息的主动上报接口，微信支付可以根据商户侧上报的数据进
 * 一步优化网络部署，完善服务监控，和商户更好的协作为用户提供更好的业务体验。
 * <br/>请求地址:https://api.mch.weixin.qq.com/payitil/report
 * <br/><h1>创建人: hehailong</h1><br/>
 * 创建时间：2017-7-10 下午2:57:57<br/>
 * 修改记录1：
 */
public class ReportRequest extends OphiuxBaseRequest<ReportResponse>{
	//字段名	变量名	必填	类型	示例值	描述
	/** 设备号 device_info 否 String(32) 013467007045764 微信支付分配的终端设备号，商户自定义  */
	private String device_info; 
	/**  随机字符串 nonce_str 是 String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串，不长于32位。推荐随机数生成算法 */
	private String nonce_str; 
	/**
	 * 接口URL interface_url 是 String(127) https://api.mch.weixin.qq.com/pay/unifiedorder 
	 * 报对应的接口的完整URL，类似： 
		https://api.mch.weixin.qq.com/pay/unifiedorder
		对于刷卡支付，为更好的和商户共同分析一次业务行为的整体耗时情况，对于两种接入模式，请都在门店侧对一次刷卡支付进行一次单独的整体上报，上报URL指定为： 
		https://api.mch.weixin.qq.com/pay/micropay/total
		关于两种接入模式具体可参考本文档章节：刷卡支付商户接入模式
		其它接口调用仍然按照调用一次，上报一次来进行。
	 */
	private String interface_url; 
	/** 接口耗时 execute_time_ 是 Int 1000 接口耗时情况，单位为毫秒  */
	private int execute_time; 
	/**
	 * 返回状态码 return_code 是 String(16) SUCCESS  SUCCESS/FAIL  
	 * 此字段是通信标识，非交易标识，交易是否成功需要查看trade_state来判断
	 */
	private String return_code; 
	/** 返回信息 return_msg 否 String(128) 签名失败  返回信息，如非空，为错误原因  签名失败  参数格式校验错误  */
	private String return_msg;
	/** 业务结果 result_code 是 String(16) SUCCESS SUCCESS/FAIL  */
	private String result_code; 
	/** 错误代码 err_code 否 String(32) SYSTEMERROR  ORDERNOTEXIST—订单不存在   SYSTEMERROR—系统错误  */
	private String err_code;
	/** 错误代码描述 err_code_des 否 String(128) 系统错误 结果信息描述 */
	private String err_code_des; 
	/** 商户订单号 out_trade_no 否 String(32) 1217752501201407033233368018 商户系统内部的订单号,商户可以在上报时提供相关商户订单号方便微信支付更好的提高服务质量。*/
	private String out_trade_no;  
	/** 访问接口IP user_ip 是 String(16) 8.8.8.8 发起接口调用时的机器IP */
	private String user_ip;  
	/** 商户上报时间 time 否 String(14) 20091227091010 系统时间，格式为yyyyMMddHHmmss，如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则*/
	private String time; 

	//服务商
	/**
	 * 上报数据包 trades 是  String(1024)
	!CDATA[
	 [{ "out_trade_no": "out_trade_no_test_1","begin_time": "20160602203256","end_time": "20160602203257","state": "OK","err_msg": ""},
	 {"out_trade_no": "out_trade_no_test_2","begin_time": "20160602203260","end_time": "20160602203262","state": "FAIL","err_msg": "SYSTEMERROR"}]]
	 
	POS机采集的交易信息列表，使用JSON格式的数组，每条交易包含：
	1. out_trade_no 商户订单号
	2. begin_time 交易开始时间（扫码时间)
	3. end_time 交易完成时间
	4. state 交易结果    OK   -成功    FAIL -失败   CANCLE-取消
	5. err_msg 自定义的错误描述信息
	*注意，将JSON数组的文本串放到XML节点中时，需要使用!CDATA[]标签将JSON文本串保护起来
	 */
	private String trades;
	 
	
	@Override
	public String getApiMethod() {
		return "POST";
	}

	@Override
	public String getApiVersion() {
		return null;
	}

	@Override
	public Map getTextParam() {
		Map<String, String>  map = new HashMap<String, String>();
		map.put("device_info", device_info);
		map.put("nonce_str", nonce_str);
		map.put("interface_url", interface_url);
		map.put("execute_time", execute_time+"");
		map.put("return_code", return_code);
		map.put("return_msg", return_msg);
		map.put("result_code", result_code);
		map.put("err_code", err_code);
		map.put("err_code_des", err_code_des);
		map.put("out_trade_no", out_trade_no);
		map.put("user_ip", user_ip);
		map.put("time", time);
		map.put("trades", trades);
		
		return map;
	}

	@Override
	public Class<ReportResponse> getResponseClass() {
		return ReportResponse.class;
	}

	
	
	
	
	public String getDevice_info() {
		return device_info;
	}

	public void setDevice_info(String device_info) {
		this.device_info = device_info;
	}

	public String getNonce_str() {
		return nonce_str;
	}

	public void setNonce_str(String nonce_str) {
		this.nonce_str = nonce_str;
	}

	public String getInterface_url() {
		return interface_url;
	}

	public void setInterface_url(String interface_url) {
		this.interface_url = interface_url;
	}

	public int getExecute_time() {
		return execute_time;
	}

	public void setExecute_time(int execute_time) {
		this.execute_time = execute_time;
	}

	public String getReturn_code() {
		return return_code;
	}

	public void setReturn_code(String return_code) {
		this.return_code = return_code;
	}

	public String getReturn_msg() {
		return return_msg;
	}

	public void setReturn_msg(String return_msg) {
		this.return_msg = return_msg;
	}

	public String getResult_code() {
		return result_code;
	}

	public void setResult_code(String result_code) {
		this.result_code = result_code;
	}

	public String getErr_code() {
		return err_code;
	}

	public void setErr_code(String err_code) {
		this.err_code = err_code;
	}

	public String getErr_code_des() {
		return err_code_des;
	}

	public void setErr_code_des(String err_code_des) {
		this.err_code_des = err_code_des;
	}

	public String getOut_trade_no() {
		return out_trade_no;
	}

	public void setOut_trade_no(String out_trade_no) {
		this.out_trade_no = out_trade_no;
	}

	public String getUser_ip() {
		return user_ip;
	}

	public void setUser_ip(String user_ip) {
		this.user_ip = user_ip;
	}

	public String getTime() {
		return time;
	}

	public void setTime(String time) {
		this.time = time;
	}

	public String getTrades() {
		return trades;
	}

	public void setTrades(String trades) {
		this.trades = trades;
	}

	
	
}
